//输入数字 n，按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3，则打印出 1、2、3 一直到最大的 3 位数 999。 
//
// 示例 1: 
//
// 输入: n = 1
//输出: [1,2,3,4,5,6,7,8,9]
// 
//
// 
//
// 说明： 
//
// 
// 用返回一个整数列表来代替打印 
// n 为正整数 
// 
// Related Topics 数组 数学 👍 178 👎 0

package com.cute.leetcode.editor.cn;
public class DaYinCong1daoZuiDaDeNweiShuLcof {
    public static void main(String[] args) {
        new DaYinCong1daoZuiDaDeNweiShuLcof().new Solution().printNumbers2(3);
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 这一题应该是要考察大数的，但是网站上的输入没有到达大数的范围
         */
        public int[] printNumbers(int n) {
            StringBuilder s = new StringBuilder();
            for (int i = 0; i < n; i++) s.append("9");// 用字符串来统计总数
            int[] res = new int[Integer.parseInt(s.toString())];
            for (int i = 0; i < res.length; i++) res[i] = i + 1;
            return res;
        }

        /**
         * 考察大数的时候，可以用char[]来进行模拟数字的全排列
         * 处理大数时借用字符串是常规的方法
         */
        public void printNumbers2(int n) {
            if (n <= 0) return;
            char[] num = new char[n];
            for (int i = 0; i < 10; i++) {//最高位的变化
                num[0] = (char) (i + '0');
                dfs(num, 0, n);
            }

        }
        private void dfs(char[] num, int index, int length){
            if (index == length - 1) print(num);//到达最低为再打印输出
            else {
                for (int i = 0; i < 10; i++) {//由高位到低位依次修改
                    num[index + 1] = (char) (i + '0');
                    dfs(num, index + 1, length);
                }
            }
        }
        private void print(char[] num){// 按照阅读习惯进行打印
            int i = 0;
            for (; i < num.length; i++) if (num[i] != '0') break;
            System.out.println(new String(num).substring(i));
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}